﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
using csNotificaciones;

namespace MotorMetricas.Logica
{
    public class MetricaMetodosSobreescritos : AbstractMetrica
    {
        override public int Generar(String ruta)
        {
            ManejoArchivo Manejador = new ManejoArchivo();
            List<String> listaMs = new List<string>();
            ArrayList misarchivos = null;
            Boolean SinError = true;

            if (Manejador.ValidarRuta(ruta))
            {
                /*
                 * el metodo ObtenerArchivos devuelve el Array de strings con las direcciones
                 * de todos los archivos a evaluar, recorriendo todas las subcarpetas
                 */
                misarchivos = Manejador.ObtenerArchivos(ruta);
            }
            else
            {
                SinError = false;
                //Console.WriteLine("ERROR: Ruta invalida");
            }

            if (SinError)
            {

                foreach (String rutaArchivo in misarchivos)
                {
                    if (Manejador.ValidarArchivo(rutaArchivo))
                    {
                        listaMs = ContarMetodosSobreescritos(rutaArchivo,listaMs);   
                    }

                }
            }

            Notificacion.mostrarVentana("Metrica de Metodos Sobreescritos", "La metrica se ha generado con éxito\nResultado: " + listaMs.Count.ToString(), Notificacion.Imagen.Ok, 2);
            return listaMs.Count;
        }

        // Metodo que suma todos los metodos sobreescritos de los archivos y lo agrega a una lista para ver que no se repita
        public List<string> ContarMetodosSobreescritos(string rutaArchivo, List<string> listaMetodos)
        {
            string linea = null;
            bool flag;
            try
            {
                StreamReader archivo = new StreamReader(rutaArchivo);
                flag = false;
                while ((linea = archivo.ReadLine()) != null)
                {
                    // Compara que este sobreescribiendo un metodo
                    if (linea.Contains("override"))
                        if ((linea.Contains("public")) || (linea.Contains("private")))
                            if ((linea.Contains("(")) && (linea.Contains(")")))
                                // Revisa si la lista esta vacia y lo agrega directamente
                                if (listaMetodos.Count == 0)
                                {
                                    listaMetodos.Add(linea);
                                    flag = false;
                                   
                                }
                                else
                                {
                                    // Compara la lista para ver que el metodo no se repita y si no se repite lo agrega a la lista
                                    foreach (string posicionLista in listaMetodos)
                                    {
                                        if ((linea.Contains(posicionLista)) || (posicionLista.Contains(linea)))
                                        {
                                            flag = false;
                                            break;
                                        }
                                        else
                                            flag = true;

                                    }
                                }
                    // Bandera para ver que nunca se repitio el nombre del metodo y sino se repitio lo agrega a la lista
                    if (flag)
                    {
                        listaMetodos.Add(linea);
                        flag = false;
                        
                    }
                }
                archivo.Close();
            }
            catch (Exception e)
            {
                Notificacion.mostrarVentana("Metrica de Metodos Sobreescritos", "Ha ocurrido un error al generar esta metrica", Notificacion.Imagen.Error, 1);
            }

            return listaMetodos;
        }
    }
}
